#pragma once

#include <boost/describe.hpp>

#include <algorithm/shared/utils/Para.h>
#include <algorithm/shared/utils/Vec2.h>
#include <utils/HasValue.h>
#include <utils/ParaUtils.h>

namespace solar
{
    /// \brief 场景参数-各定日镜单独设置的部分（镜面为玻璃的定日镜）
    /// 若无特殊说明，Vec类型的分量顺序为(x, y, z)
    class HeliostatWithGlassPara : public Para
    {
        public:
            HeliostatWithGlassPara() = default;
#include <utils/class_name.inc>

        private:
            // Huang-model specific

            double refractivity_ = kUndefined;    // 折射率
            double glass_thickness_ = kUndefined; // 玻璃层厚度
            Vec2 sigma_glass_up_slope_error_{kUndefined,
                                             kUndefined}; // 玻璃上表面面的微表面法向扰动（mrad）

            // Auto-generated Part

            Vec2 sigma_glass_refract_1_{kUndefined,
                                        kUndefined}; // 玻璃表面上第一次折射的光学误差（mrad）
            Vec2 sigma_glass_reflect_{kUndefined, kUndefined}; // 玻璃底面上反射的光学误差（mrad）
            Vec2 sigma_glass_refract_2_{kUndefined,
                                        kUndefined}; // 玻璃表面上第二次折射的光学误差（mrad）

            BOOST_DESCRIBE_CLASS(HeliostatWithGlassPara, (Para), (), (),
                                 (refractivity_, glass_thickness_, sigma_glass_up_slope_error_,
                                  sigma_glass_refract_1_, sigma_glass_reflect_,
                                  sigma_glass_refract_2_))
    };
} // namespace solar

#define CURRENT_CLASS_NAME HeliostatWithGlassPara
#include <utils/class_describe_header.inc>
SOLAR_DESCRIBE_CLASS(HeliostatWithGlassPara, (Para), (), (),
                     (refractivity_, glass_thickness_, sigma_glass_up_slope_error_,
                      sigma_glass_refract_1_, sigma_glass_reflect_, sigma_glass_refract_2_))
